//
//  StatusListViewModel.swift
//  Weibo
//
//  Created by 梁智 on 15/11/26.
//  Copyright © 2015年 lzfree. All rights reserved.
//

import Foundation
import SDWebImage

/// 微博数据列表模型 － 封装网络方法
class StatusListViewModel {
    
    /// 微博数据数组
    lazy var statusList = [StatusViewModel]()
    
    /// 下拉刷新计数
    var pulldownCount: Int?
    
    /// 加载网络数据
    ///
    /// - parameter isPullup: 是否上拉刷新
    /// - parameter finished: 完成回调
    func loadStatus(isPullup isPullup: Bool, finished: (isSuccessed: Bool) -> ()) {
        
        // 下拉刷新 - 数组中第一条微博的 id
        let since_id = isPullup ? 0 : (statusList.first?.status.id ?? 0)
        // 上拉刷新 - 数组中最后一条微博的 id
        let max_id = isPullup ? (statusList.last?.status.id ?? 0) : 0
        
        StatusDAL.loadStatus(since_id, max_id: max_id) { (array) -> () in
            // 如果数组为nil，表示有错误
            guard let array = array else  {
                finished(isSuccessed: false)
                
                return
            }
        
            
            // 遍历字典的数组,字典转模型
            // 1. 可变的数组
            var dataList = [StatusViewModel]()
            
            // 2. 遍历数组
            for dict in array {
                dataList.append(StatusViewModel(status: Status(dict: dict)))
            }
            
            // 记录下拉刷新的数据
            self.pulldownCount = (since_id > 0) ? dataList.count : nil
            
            // 3. 拼接数据
            if max_id > 0 {
                
                self.statusList += dataList
                
            } else {
                
                self.statusList = dataList + self.statusList
            }
            print(self.statusList.count)
            
            // 4.缓存单张图片
            self.cacheSingleImage(dataList, finished: finished)
        }
    }
    
    /// 缓存单张图片
    private func cacheSingleImage(dataList: [StatusViewModel], finished: (isSuccessed: Bool) -> ()) {
        
        // 1.创建调度组
        let group = dispatch_group_create()
        // 缓存数据长度
        var dataLength = 0
        
        // 2.遍历视图模型数组
        for vm in dataList {
            // 只缓存单张图片
            if vm.thumbnailUrls?.count != 1 {
                continue
            }
            
            // 获取 url
            let url = vm.thumbnailUrls![0]
            print("开始缓存图像\(url)")
            
            // 入组
            dispatch_group_enter(group)
            
            SDWebImageManager.sharedManager().downloadImageWithURL(url, options: [SDWebImageOptions.RefreshCached, SDWebImageOptions.RetryFailed], progress: nil, completed: { (image, error, _, _, _) -> Void in
                
                if let img = image,let data = UIImagePNGRepresentation(img) {
                    dataLength += data.length
                }
                
                // 出组
                dispatch_group_leave(group)
                
            })
            
        }
        
        // 3.监听调度组完成
        dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
            print("缓存完成\(dataLength / 1024) K")
            // 完成回调
            finished(isSuccessed: true)
        }
    }
}